package fulbitofacil.dao;


import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import fulbitofacil.exception.DAOExcepcion;
import fulbitofacil.modelo.Cancha;
import fulbitofacil.modelo.Horario;
import fulbitofacil.util.ConexionBD;

public class CanchaDAO {

	public void insertar(Cancha vo) throws DAOExcepcion {
		System.out.println("CanchaDAO: insertar(Cancha vo)");
		String query = "INSERT INTO Cancha(nombre,estado,descripcion,Local_idLocal,usuario_idUsuario) VALUES (?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getNombre());
			stmt.setInt(2, vo.getEstado());
			stmt.setString(3, vo.getDescripcion());
			stmt.setInt(4,vo.getLocal_idLocal());
			stmt.setInt(5, vo.getUsuario_idUsuario());
						
			int i = stmt.executeUpdate(); 
			if (i != 1 ) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	
	public List listarContenido() throws DAOExcepcion {
		Connection con = null;
	
		List Lista = new ArrayList<Cancha>();

		try {
			// creamos el statement

			System.out.println("entro al try");
			
			con = ConexionBD.obtenerConexion();
			Statement st = con.createStatement();

			String sql = "SELECT idCancha,nombre,estado,descripcion from cancha";
			ResultSet rs = st.executeQuery(sql);
			
			while (rs.next()) {
				Cancha cont = new Cancha();
				cont.setIdCancha(rs.getInt("idCancha"));
				cont.setNombre(rs.getString("nombre"));
				cont.setEstado(rs.getInt("estado"));
				cont.setDescripcion(rs.getString("descripcion"));
				// agregando a la lista
				Lista.add(cont);
				
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("entro al catch");
			e.printStackTrace();
		}
		return Lista; 
	}
	
	
	public Collection<Cancha> buscarPorNombre(String nombre) throws DAOExcepcion {
		System.out.println("CanchaDAO: buscarPorNombre(String nombre)");
		String query = "SELECT nombre FROM cancha WHERE nombre like ?";
		Collection<Cancha> lista = new ArrayList<Cancha>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			rs = stmt.executeQuery(); //para select *....
			while (rs.next()) {
				Cancha vo = new Cancha();
				vo.setNombre(rs.getString("nombre"));
				vo.setEstado(rs.getInt("estado"));
				vo.setDescripcion(rs.getString("descripcion"));
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
	
	public Collection<Cancha> buscarDistritoDiasHoras(int distrito, Date fecha_desde, Date fecha_hasta, 
										String hora_desde, String hora_hasta)throws DAOExcepcion{
		String queryHorarioCancha = "SELECT * from horario h JOIN cancha c WHERE h.cancha_idCancha = c.idCancha";
		String queryTablaLocal 	  = "SELECT  from tablahc JOIN local WHERE local.idLocal = tablahc.Local_idLocal";
		String queryCancha        = "SELECT * from resultado WHERE horario.hora_ini<=? AND horario.hora_fin>=? " +
				"AND horario.fecha_ini<=? AND horario.fecha_fin>=? AND local.distrito";
		
		Connection con1 = null;
		PreparedStatement stmt1 =null;
		PreparedStatement stmt2 =null;
		ResultSet tablahc = null;
		ResultSet resultado = null;
		
		Collection<Cancha> lista_cancha = new ArrayList<Cancha>();
		Connection con = null;
		PreparedStatement stmt =null;
		ResultSet rs = null;
		
		// juntamos la tabla horario con cancha
		try {
			con1 = ConexionBD.obtenerConexion();
			stmt1 = con1.prepareStatement(queryHorarioCancha);
			tablahc = stmt1.executeQuery();  //me devuelve la tabla con el join
			stmt1 = con1.prepareStatement(queryTablaLocal);
			resultado = stmt2.executeQuery();   //me devuelve la tabla final			
			
			//realizamos la busqueda segun los criterios
			stmt = con.prepareStatement(queryCancha);
			stmt.setDate(1, fecha_desde);
			stmt.setDate(2, fecha_hasta);
			stmt.setString(3,hora_desde);
			stmt.setString(4,hora_hasta);
			rs = stmt.executeQuery();
			
			while (rs.next()) {
				Cancha vo = new Cancha();
				Horario ho = new Horario();
				int idCancha = rs.getInt("idCancha");
				vo.setIdCancha(idCancha);
				vo.setNombre(rs.getString("nombre"));
				vo.setEstado(rs.getInt("estado"));
				vo.setDescripcion(rs.getString("descripcion"));
				lista_cancha.add(vo);
			}
			
			
		} catch (Exception e) {
			// TODO: handle exception
			
		}
		
		
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(queryCancha);
			stmt.setDate(1, fecha_desde);
			stmt.setDate(2, fecha_hasta);
			stmt.setString(3,hora_desde);
			stmt.setString(4,hora_hasta);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cancha vo = new Cancha();
				Horario ho = new Horario();
				//Buscar en la tabla horario, los horarios que pertenecen
				//a esta Cancha
				
				String queryHorarios = "SELECT * from horario WHERE hora_ini<=? AND hora_fin>=? AND fecha_ini<=?" +
						"AND fecha_fin>=? AND distrito=?";
				
				int idCancha = rs.getInt("idCancha");	
				vo.setNombre(rs.getString("nombre"));
				vo.setEstado(rs.getInt("estado"));
				vo.setDescripcion(rs.getString("descripcion"));
				lista_cancha.add(vo);
			}
			
		} catch (Exception e) {
			// TODO: handle exception
		}
	 return null;	
	}
	
	
	public void modificarContenido(Cancha cont) {
		// TODO Auto-generated method stub
		Connection con = null;
		try {
			// creamos el statement
			con = ConexionBD.obtenerConexion();
			Statement st = con.createStatement();
			
			String sql = "select *from canchas where idCancha="+cont.getIdCancha();
			st.executeUpdate(sql);
			st.close();
			con.close();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	
	
	public Cancha retornarCancha(int id) {
		// TODO Auto-generated method stub		
		Connection con=null;
		Cancha cancha = new Cancha();
		
		try {
			con = ConexionBD.obtenerConexion();
			// creamos el statement
			Statement st = con.createStatement();
			
			String sql = "select * from cancha where id='" + id + "'";
			ResultSet rs = st.executeQuery(sql);
			
			if (rs.next()) {
				cancha.setIdCancha(rs.getInt("id"));
				cancha.setUsuario_idUsuario(rs.getInt("usuario_idUsuario"));
			}
			
			//st.executeUpdate(sql);
			st.close();
			con.close();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return cancha;
	}
	
	
	
	private void cerrarStatement(PreparedStatement stmt) {
		// TODO Auto-generated method stub

	}

	private void cerrarConexion(Connection con) {
		// TODO Auto-generated method stub

	}
	
}
